home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus Special 25 / AMIGAplus Sonderheft 25 (2000)(Falke)(DE)(Track 1 of 4)[!].iso / Updates / HD-Installer / jst_dev / sources / src / DiskTools / readdostrack.asm < prev    next >
Assembly Source File  |  2000-04-12  |  4KB  |  255 lines

  1. ; *** $VER: trackdisk.device utilities V1.2b
  2. ; *** Written by Jean-François Fabre
  3. ; ***
  4. ; *** Thanks to Harry
  5.  
  6.  
  7.     include    "libs.i"
  8.     include    "gp_macros.i"
  9.     include    "LVOs.i"
  10.     include    "devices/trackdisk.i"
  11.     include    "exec/io.i"
  12.  
  13.     XREF    _SysBase
  14.  
  15. ; *** DOS Disks track read/write
  16. ; *** Sorry for the shitty code
  17. ;
  18. ; At least it works fine
  19.  
  20. DOS_SECTOR_LEN=512
  21. DOS_TRACK_LEN=DOS_SECTOR_LEN*11
  22.  
  23.  
  24.     XDEF    _ReadRawTrackSync
  25.     XDEF    @ReadRawTrackSync
  26.  
  27.     XDEF    _ReadRawTrackIndex
  28.     XDEF    @ReadRawTrackIndex
  29.  
  30.     XDEF    _ReadDosTrack
  31.     XDEF    _WriteDosTrack
  32.     XDEF    _ReadSector
  33.     XDEF    _WriteSector
  34.     XDEF    _InitTrackDisk
  35.     XDEF    _ShutTrackDisk
  36.     
  37.     XDEF    _ReadBoot
  38.     XDEF    _WriteBoot
  39.     XDEF    _CheckDiskIn
  40.     XDEF    _CheckWriteProtect
  41.     XDEF    @ReadBoot
  42.  
  43. _ReadRawTrackIndex:
  44.     move.l    8(A7),A0
  45.     move.l    4(A7),D0
  46. @ReadRawTrackIndex:
  47.     movem.l    D1-D6/A1-A6,-(sp)
  48.     lea    diskio,a1
  49.     move.w    #TD_RAWREAD,IO_COMMAND(a1)
  50.     move.b    #IOTDB_INDEXSYNC,IO_FLAGS(a1)
  51.     move.l    A0,IO_DATA(a1)
  52.     move.l    #$7FFE,IO_LENGTH(a1)
  53.     move.l    D0,IO_OFFSET(a1)
  54.     move.l  _SysBase,a6
  55.     JSRLIB    DoIO
  56.     movem.l    (sp)+,D1-D6/A1-A6
  57.     rts    
  58.  
  59.     ; *** this routine does not work properly due to a bug of the OS
  60.     ; *** according to Harry
  61.  
  62. _ReadRawTrackSync:
  63.     move.l    8(A7),A0
  64.     move.l    4(A7),D0
  65. @ReadRawTrackSync:
  66.     movem.l    D1-D6/A1-A6,-(sp)
  67.     lea    diskio,a1
  68.     move.w    #TD_RAWREAD,IO_COMMAND(a1)
  69.     move.b    #IOTDB_WORDSYNC,IO_FLAGS(a1)
  70.     move.l    A0,IO_DATA(a1)
  71.     move.l    #$7C00,IO_LENGTH(a1)
  72.     move.l    D0,IO_OFFSET(a1)
  73.     move.l  _SysBase,a6
  74.     JSRLIB    DoIO
  75.     movem.l    (sp)+,D1-D6/A1-A6
  76.     rts    
  77.  
  78. _ReadDosTrack:
  79.     move.l    8(A7),A0
  80.     move.l    4(A7),D0
  81. @ReadDosTrack:
  82.     movem.l    D1-A6,-(A7)
  83.     mulu.w    #DOS_TRACK_LEN,D0
  84.     lea    diskio,a1
  85.     move.w    #2,28(a1)
  86.     move.l    A0,40(a1)
  87.     move.l    #DOS_TRACK_LEN,36(a1)
  88.     move.l    D0,44(a1)
  89.     move.l  _SysBase,a6
  90.     JSRLIB    DoIO
  91.     movem.l    (A7)+,D1-A6
  92.     rts
  93.  
  94. _ReadBoot:
  95.     move.l    4(A7),D0
  96. @ReadBoot:
  97.     STORE_REGS
  98.     lea    diskio,a1
  99.     move.w    #2,28(a1)    ; Command = read
  100.     move.l    D0,40(a1)    ; Buffer
  101.     move.l    #2*DOS_SECTOR_LEN,36(a1)    ; Boot length
  102.     move.l    #0,44(a1)    ; Boot sector
  103.     move.l  _SysBase,a6
  104.     JSRLIB    DoIO
  105.     RESTORE_REGS
  106.     moveq    #0,D0    
  107.     rts
  108.  
  109. _WriteBoot:
  110.     move.l    4(A7),D0
  111. @WriteBoot:
  112.     STORE_REGS
  113.     lea    diskio,a1
  114.     move.w    #3,28(a1)    ; Command = write
  115.     move.l    D0,40(a1)    ; Buffer
  116.     move.l    #2*DOS_SECTOR_LEN,36(a1)    ; Boot length
  117.     move.l    #0,44(a1)    ; Boot sector
  118.     move.l  _SysBase,a6
  119.     JSRLIB    DoIO
  120.     RESTORE_REGS
  121.     moveq    #0,D0    
  122.     rts
  123.  
  124. _WriteDosTrack:
  125.     move.l    8(A7),A0
  126.     move.l    4(A7),D0
  127. @WriteDosTrack:
  128.     movem.l    D1-A6,-(sp)
  129.     mulu.w    #DOS_TRACK_LEN,D0
  130.     lea     diskio(PC),a1
  131.     move    #3,28(a1)        ; CMD_WRITE
  132.     move.l  A0,40(a1)
  133.     move.l  #DOS_TRACK_LEN,36(a1)
  134.     move.l  D0,44(a1)
  135.     move.l  _SysBase,a6
  136.     JSRLIB    DoIO
  137.     movem.l    (A7)+,D1-A6
  138.     rts
  139.     
  140. _WriteSector:
  141.     move.l    8(A7),A0
  142.     move.l    4(A7),D0
  143. @WriteSector:
  144.     STORE_REGS
  145.     mulu.w    #DOS_SECTOR_LEN,D0
  146.     lea     diskio(PC),a1
  147.     move.w    #3,28(a1)        ; CMD_WRITE
  148.     move.l  A0,40(a1)
  149.     move.l  #DOS_SECTOR_LEN,36(a1)
  150.     move.l  D0,44(a1)
  151.     move.l  _SysBase,a6
  152.     JSRLIB    DoIO
  153.     RESTORE_REGS
  154.     moveq    #0,D0    
  155.     rts
  156.  
  157. _ReadSector:
  158.     move.l    8(A7),A0
  159.     move.l    4(A7),D0
  160. @ReadSector:
  161.     STORE_REGS
  162.     mulu.w    #DOS_SECTOR_LEN,D0
  163.     lea     diskio(PC),a1
  164.     move.w    #2,28(a1)        ; CMD_READ
  165.     move.l  A0,40(a1)
  166.     move.l  #DOS_SECTOR_LEN,36(a1)
  167.     move.l  D0,44(a1)
  168.     move.l  _SysBase,a6
  169.     JSRLIB    DoIO
  170.     RESTORE_REGS
  171.     moveq    #0,D0    
  172.     rts
  173.  
  174.  
  175. @SendCommand:
  176.     movem.l    D1-A6,-(sp)
  177.     lea    diskio(PC),a1
  178.     move.w    d0,IO_COMMAND(a1)
  179.     move.l  _SysBase,a6
  180.     JSRLIB    DoIO
  181.     move.l  32(a1),d0
  182.     movem.l    (sp)+,D1-A6
  183.     rts
  184.  
  185. _CheckDiskIn:
  186. @CheckDiskIn:
  187.     moveq    #14,d0        ; Test Disk Inserted
  188.     bsr    @SendCommand
  189.     rts
  190.  
  191. _CheckWriteProtect:
  192. @CheckWriteProtect:
  193.     moveq    #15,d0        ; Test Disk Write Protected
  194.     bsr    @SendCommand
  195.     rts
  196.  
  197. _InitTrackDisk:
  198.     move.l    4(sp),D0
  199. @InitTrackDisk:
  200.     STORE_REGS
  201.  
  202.     move.l    D0,diskunit
  203.  
  204.     move.l    _SysBase,a6
  205.     sub.l    a1,a1
  206.     JSRLIB    FindTask
  207.     move.l    d0,diskrep+$10
  208.     
  209.     lea    diskrep(PC),a1
  210.     JSRLIB    AddPort
  211.     
  212.     lea    diskio(PC),a1
  213.     move.l    #diskrep,14(a1)
  214.     move.l    diskunit,d0
  215.     clr.l    d1
  216.     lea    trddevice(PC),a0
  217.     JSRLIB    OpenDevice
  218.     RESTORE_REGS
  219.     move.l    #diskio,D0
  220.     rts
  221.     
  222. _ShutTrackDisk:
  223. @ShutTrackDisk:
  224.     STORE_REGS
  225.     move.l _SysBase,a6
  226.     lea     diskio,a1  ; pointeur sur I/O disque
  227.     move.l  32(a1),d7
  228.     move    #9,28(a1)  ;  Moteur marche/arret
  229.     move.l  #0,36(a1)  ; 0=arret,1=marche,c'est a dire arreter
  230.     JSRLIB    DoIO   ; moteur
  231.     
  232.     lea    diskio,a1
  233.     JSRLIB    CloseDevice ;  Fermer Trackdisk.device
  234.     
  235.     lea    diskrep,a1
  236.     JSRLIB    RemPort    ; Liberer port
  237.     RESTORE_REGS
  238.     moveq    #0,D0
  239.     rts
  240.     
  241.  
  242. diskio:
  243.     blk.l 20,0
  244.     
  245. diskrep:
  246.     blk.l 8,0
  247.  
  248. diskunit:
  249.     dc.l    0
  250.  
  251. trddevice:
  252.     dc.b    'trackdisk.device',0
  253.     cnop    0,4
  254.  
  255.